package com.jdiv;

import java.util.ArrayList;

public class JLoop extends Thread implements JConst{

public static ArrayList<Thread> threads=new ArrayList<Thread>();


	public JLoop(){}
	
	public void run(){
	
		while(true){
			
			cleanProcess();
			doLoop();
			//looping();
			JDiv.delay(DELAY);
			
		}
	}
	
	private void looping(){
		

		for (int i=0;i<JDiv.process.size();i++){
		
			 if (!JDiv.process.get(i).isBegin() && JDiv.process.get(i).status==S_WAKEUP  && !JDiv.process.get(i).isAlive() ){
				JDiv.process.get(i).hilo=new Thread(JDiv.process.get(i));
					JDiv.process.get(i).hilo.start();
	
					
			 }
			 
			
				
			 
			if ( !JDiv.process.get(i).isAlive() && JDiv.process.get(i).isLoop()  && JDiv.process.get(i).isBegin()  ){
				JDiv.process.get(i).run();
				/*
				JDiv.process.get(i).hilo.stop();
			//	JDiv.process.get(i).hilo.destroy();
				JDiv.process.get(i).hilo = null;
			
					JDiv.process.get(i).hilo=new Thread(JDiv.process.get(i));
					JDiv.process.get(i).hilo.setPriority(Thread.MIN_PRIORITY);
					JDiv.process.get(i).hilo.start();
				
				*/
				
			/*	
				System.out.println(JDiv.process.get(i).name + ":"+JDiv.process.get(i).isLoop() +":"+JDiv.process.get(i).isBegin()+":"+JDiv.process.get(i).isAlive() );
		*/
			/*	
				System.out.println(	"OTRO:" + JDiv.process.get(i).name);
			}else{
				JDiv.process.get(i).run();
				System.out.println(	JDiv.process.get(i).name);*/
			}
			
		
			
		}
	}
	
	public synchronized void doLoop(){
	/*	
		if (JDiv.program!=null){
			
			new Thread(){
				public void run(){
					JDiv.program.loop();
				}
			}.start();
			
			
		}
		*/
	
	if (JDiv.program!=null && !JDiv.program.isAlive()){
			
			if (JDiv.program.hilo==null || !JDiv.program.hilo.isAlive()){
				JDiv.program.hilo=new Thread(JDiv.program);
				JDiv.program.hilo.start();
				
			//	System.out.println(	JDiv.process.get(i).name);
			}
						
	}
	
		for (int i=0;i<JDiv.process.size();i++){
		
			if (JDiv.process.get(i)!=null && !JDiv.process.get(i).isAlive() && JDiv.process.get(i).status==S_WAKEUP ){
				
				if (JDiv.process.get(i).hilo==null || !JDiv.process.get(i).hilo.isAlive()){
					JDiv.process.get(i).hilo=new Thread(JDiv.process.get(i));
					//JDiv.process.get(i).hilo.setPriority(Thread.MAX_PRIORITY);
					JDiv.process.get(i).hilo.start();
					
				//	System.out.println(	JDiv.process.get(i).name);
				}
				
			}
			
		
		  final int id=i;
/*		  
	
	 if (!JDiv.process.get(i).isBegin() && JDiv.process.get(i).status==S_WAKEUP){
					new Thread(){
							public void run(){
								JDiv.process.get(id).begin();
								JDiv.process.get(id).begin=true;
							}
						}.start();
						
				 }
				
*/
		  
	
	/*	
		  if (JDiv.process.get(i)!=null && JDiv.process.get(i).status==S_WAKEUP && JDiv.process.get(i).isBegin()){
			
				if (threads.size()>i){
			
							
					 if (threads.get(i)!= null && !threads.get(i).isAlive()){
		
						 Thread t=new Thread(){
							public void run(){
							
								if (id<JDiv.process.size())
								JDiv.process.get(id).loop();
							}
						};
						
						threads.remove(threads.get(i));	
						threads.add(i,t);
					    t.start();
						
					 }else{
				//		 System.out.println("Vivo "+i+" | "+JDiv.process.get(i).getClass().getSimpleName()+" | "+threads.get(i));
					 }
					
		
					 
			    }		
			}			
		  
	
				
			*/
		//	JDiv.update();	
			 
		 }
		
	}
	
	
	private synchronized void cleanProcess(){
		for (int i=0;i<JDiv.process.size();i++){
			// || (JDiv.process.get(i).isBegin() && !JDiv.process.get(i).isLoop())
			 if (JDiv.process.get(i)!=null && (JDiv.process.get(i).status==S_KILL) || (JDiv.process.get(i).isBegin() && !JDiv.process.get(i).isLoop()) ){
			//	 System.out.println(JDiv.process.get(i).name+" | Dead ");
				 JDiv.process.remove(JDiv.process.get(i));
			
			 }

			 
		}
	}
	 
	
	
}